package org.ruoyi.common.dhuman.backup;

import java.io.BufferedReader;
import java.io.File;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.ArrayList;
import java.util.List;

/**
 * 绿幕视频背景去除处理器
 * 使用FFmpeg处理含绿幕的视频，去除绿色背景并输出新的透明背景视频
 */
public class GreenScreenVideoProcessor {

    private String ffmpegPath;

    /**
     * 构造函数
     *
     * @param ffmpegPath FFmpeg可执行文件路径，如果为null则使用系统PATH中的ffmpeg
     */
    public GreenScreenVideoProcessor(String ffmpegPath) {
        this.ffmpegPath = ffmpegPath != null ? ffmpegPath : "ffmpeg";
    }

    /**
     * 去除视频绿幕背景
     * 处理C:\Users\Admin\Videos\result.mp4中的绿色背景并输出新视频
     *
     * @param inputVideoPath  输入的绿幕视频路径
     * @param outputVideoPath 输出的去背景视频路径
     * @throws IOException          IO异常
     * @throws InterruptedException 中断异常
     */
    public void removeGreenScreenbg(String inputVideoPath, String outputVideoPath)
            throws IOException, InterruptedException {
        
        // 检查输入文件是否存在
        File inputFile = new File(inputVideoPath);
        if (!inputFile.exists()) {
            throw new IOException("输入视频文件不存在: " + inputVideoPath);
        }

        // 确保输出目录存在
        File outputFile = new File(outputVideoPath);
        File outputDir = outputFile.getParentFile();
        if (outputDir != null && !outputDir.exists()) {
            outputDir.mkdirs();
        }

        // 构建FFmpeg命令
        List<String> command = buildFFmpegCommand(inputVideoPath, outputVideoPath);

        // 执行FFmpeg命令
        executeCommand(command);
    }

    /**
     * 构建FFmpeg命令 - 使用chromakey滤镜去除绿幕背景
     *
     * @param inputVideoPath  输入视频路径
     * @param outputVideoPath 输出视频路径
     * @return FFmpeg命令列表
     */
    private List<String> buildFFmpegCommand(String inputVideoPath, String outputVideoPath) {
        List<String> command = new ArrayList<>();
        command.add(ffmpegPath);
        
        // 输入文件
        command.add("-i");
        command.add(inputVideoPath);

        // 使用滤镜处理绿幕去除
        command.add("-filter_complex");
        // 使用chromakey滤镜去除绿色背景
        // 参数说明: color=0x00ff00(绿色), similarity=0.1(相似度), blend=0.1(混合度)
        command.add("[0:v]chromakey=0x00ff00:0.1:0.1[video]");

        // 设置输出格式和编码参数
        command.add("-map");
		// 映射处理后的视频流
        command.add("[video]");
        command.add("-map");
		// 映射原始音频流（如果存在）
        command.add("0:a?");
        
        command.add("-c:v");
		// 使用H.264编码
        command.add("libx264");
        command.add("-crf");
		// 视频质量控制
        command.add("23");
        command.add("-preset");
		// 编码速度和压缩率的平衡
        command.add("medium");
        command.add("-pix_fmt");
		// 像素格式（支持alpha通道）
        command.add("yuva420p");
        
        // 音频处理
        command.add("-c:a");
		// 音频流重新编码
        command.add("aac");
        command.add("-b:a");
		// 音频比特率
        command.add("128k");

		// 输出文件
        command.add(outputVideoPath);

        return command;
    }

    /**
     * 执行命令
     *
     * @param command 命令列表
     * @throws IOException          IO异常
     * @throws InterruptedException 中断异常
     */
    private void executeCommand(List<String> command) throws IOException, InterruptedException {
        System.out.println("执行命令: " + String.join(" ", command));

        ProcessBuilder processBuilder = new ProcessBuilder(command);
        processBuilder.redirectErrorStream(true);
        Process process = processBuilder.start();

        BufferedReader reader = new BufferedReader(new InputStreamReader(process.getInputStream()));
        String line;
        while ((line = reader.readLine()) != null) {
            System.out.println(line);
        }

        int exitCode = process.waitFor();
        if (exitCode != 0) {
            throw new RuntimeException("FFmpeg处理失败，退出码: " + exitCode);
        }
    }

    /**
     * 主方法 - 执行绿幕背景去除处理
     */
    public static void main(String[] args) {
        // 指定视频文件路径
        String inputVideoPath = "C:\\Users\\Admin\\Videos\\result.mp4";
        String outputVideoPath = "C:\\Users\\Admin\\Videos\\result_no_bg.mp4";

        // 创建处理器实例
        GreenScreenVideoProcessor processor = new GreenScreenVideoProcessor(null);

        try {
            System.out.println("开始处理绿幕视频...");
            System.out.println("输入视频: " + inputVideoPath);
            System.out.println("输出文件: " + outputVideoPath);

            processor.removeGreenScreenbg(inputVideoPath, outputVideoPath);

            System.out.println("绿幕背景去除处理完成!");
            System.out.println("输出文件位置: " + outputVideoPath);

        } catch (Exception e) {
            System.err.println("视频处理失败: " + e.getMessage());
            e.printStackTrace();
        }
    }
}